/**
 * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
 *
 * 寻找最长路径
 * @param arr int整型二维数组 二维数组
 * @return int整型
 */
function findLongestPath (arr) {
  // write code here
  // 特殊情况判断
  if (arr.length === 0) return 0
  let dp = new Array(arr.length).fill(0).map(() => new Array(arr[0].length).fill(0)) // 表示dp[i][j]到达i,j点的最大步数
  let dirs = [[-1, 0], [1, 0], [0, -1], [0, 1]] // 四个方向
  let res = 1 // 结果
  // 对每一个都可能是起点
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr[0].length; j++) {
      res = Math.max(res, dfs(i, j))
    }
  }
  function isValid (x, y) {
    return x >= 0 && x < arr.length && y >= 0 && y <= arr[0].length
  }
  function dfs (x, y) {
    // 传入的是左边的参数
    // 向4个方向走
    let steps = 1
    for (let i = 0; i < 4; i++) {
      let newx = x + dirs[i][0]
      let newy = y + dirs[i][1]
      if (isValid(newx, newy) && arr[newx][newy] > arr[x][y]) {
        // 如果这个是有效的 并且这个位置是大于原来的
        dfs(newx, newy) // 递归这个新的
        steps = Math.max(steps, dp[newx][newy] + 1) // 这一步取周围的大一步
      }
    }
    return dp[x][y] = steps
  }
  return res
}
module.exports = {
  findLongestPath: findLongestPath
};